package com.meimeixia.pattern.singleton.demo7;

import java.io.Serializable;

/**
 * 静态内部类方式
 * 序列化破坏单例模式
 * @author: t-zhijiang.zhao
 * @date: 2024/11/26 上午9:56
 */
public class Singleton implements Serializable {
    // 私有化构造方法
    private Singleton() {}

    // 定义一个静态内部类
    private static class SingletonHolder{
        private static final Singleton INSTANCE = new Singleton();
    }
    // 提供公共的访问方式
    public static Singleton getInstance(){
        return SingletonHolder.INSTANCE;
    }

    //序列化破坏单例模式的解决方案
    // 当进行反序列化时，会自动调用该方法，并将该方法的返回值直接返回
    public Object readResolve(){
        return SingletonHolder.INSTANCE;
    }


    /*此刻，大家可能有这样一个疑问，上面已经说了，在反序列化时readResolve方法就会被反射调用，难道该方法就真的会被调用吗？为了弄清楚这个问题，我们就不得不去研究一下底层原理了。

那从何研究起呢？从ObjectInputStream类中的readObject方法开始研究即可，因为该方法是用来读取对象的。接下来，我们就来研究一下该方法在读取对象时，对象是新new的呢？还是调用Singleton类里面的readResolve方法直接返回的？

先进入到ObjectInputStream类的readObject方法中，如下图所示，该方法里面的代码有很多，所以大家跟着我一块走，来看一下重点的代码，其他的暂时不用去关注。
*/
}
